package cn.gov.pbc.tims.util;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.lang.StringUtils;

import cn.gov.pbc.tims.entity.Type;
 

public class HqlGenerateUtil {
	/** 时间查询符号 */
	private static final String END = "_end";
	private static final String BEGIN = "_begin";

	private static final SimpleDateFormat time = new SimpleDateFormat(
			"yyyy-MM-dd hh:mm:ss");
	
	/**
	 * 自动生成查询条件HQL 可以支持模糊查询 带有日期组合
	 * 
	 * @param cq
	 * @param searchObj
	 * @throws Exception
	 */
	public static List installHql(Map<String, String[]> parameterMap, Object searchObj,String rigor) throws Exception {
		StringBuffer sqlBuffer = new StringBuffer();
		String ralation=" like ";
 	    //模糊查询
 	    if(null==rigor){
 	     ralation=" = ";
 	    }
 	    List list=new ArrayList();
 	    String modelName=searchObj.getClass().getName();
 	    sqlBuffer.append("from "+modelName+"  as model   where 1=1  ");
 	    //得到类对象
 	    Class  modelclas = Class.forName(modelName);
 	   //* 得到类中的所有属性集合modelName
	       Field[] fs = modelclas.getDeclaredFields();
	       for(int j = 0 ; j < fs.length; j++){
	           Field f = fs[j]; 
	           f.setAccessible(true); //设置些属性是可以访问的
	           // Object val = f.get(tbl);//得到此属性的值    
	           String name=f.getName();
	           String type = f.getType().toString();//得到此属性的类型
	           Object value=f.get(searchObj);
	           
	           // 添加 判断是否有区间值
			   String beginValue = null;
			   String endValue = null;
			   if (parameterMap != null&& parameterMap.containsKey(name + BEGIN)) {
					beginValue = parameterMap.get(name + BEGIN)[0].trim();
				}
				if (parameterMap != null
						&& parameterMap.containsKey(name + END)) {
					endValue = parameterMap.get(name + END)[0].trim();
				}
	           if(type.endsWith("String"))
	        	   {
	        		   if(StringUtils.isNotBlank((String)value))
	        		   {
	        			  // System.out.println("no empty "+((String)value).length());
	        			   if(ralation.contains("like"))
	        			   { sqlBuffer.append(" and model."+ name+" like  ?  \n");
	        			   	 list.add("%"+StringUtils.trim((String)value+"%"));}
	        			   else
	        			   { sqlBuffer.append(" and model."+name+ " = ? \n");   
	        			   list.add((String)value);
	        			   }
	        		   }
	        	   }
	           else if(type.endsWith("Date"))
	        	     {
						SimpleDateFormat userDefined = null;
						if (StringUtils.isNotBlank(beginValue)) {
							sqlBuffer.append(" and model."+name+ " > ? \n"); 
							if (userDefined != null) {
			        		   list.add(userDefined.parse(beginValue));	
							}
							  else if (beginValue.length() == 19) {
								list.add(time.parse(beginValue));
							} else if (beginValue.length() == 10) {
								list.add(time.parse(beginValue + " 00:00:00"));
							}
						}
						if (StringUtils.isNotBlank(endValue)) {
							sqlBuffer.append(" and model."+name+ " < ? \n"); 
							if (userDefined != null) {
								list.add(userDefined.parse(endValue));	
							} else if (endValue.length() == 19) {
								list.add(time.parse(endValue));
							} else if (endValue.length() == 10) {
								// 对于"yyyy-MM-dd"格式日期，因时间默认为0，故此添加" 23:23:59"并使用time解析，以方便查询日期时间数据
								list.add(time.parse(endValue + " 23:23:59"));
							}
						}
						if (isNotEmpty(f.get(searchObj))) {
							sqlBuffer.append(" and model."+name+ " = ? \n");   
		        			   list.add(value);
						}
	        	  }
		       	else  
		       	{
		       		if(null!=f.get(searchObj))
		       		{
		       			sqlBuffer.append(" and model."+ name+ "= ?\n");    
		       			list.add(value);
		    		   }
		       	}
	       }
	       List result=new ArrayList();
	       result.add(sqlBuffer.toString());
	       result.add(list);
	       return result;
	     }
	
	
	public static List installHql(Map<String, String[]> parameterMap, String modelName,String rigor) throws Exception {
		StringBuffer sqlBuffer = new StringBuffer();
		String ralation=" like ";
 	    //模糊查询
 	    if(null==rigor){
 	     ralation=" = ";
 	    }
 	    String packagename="cn.gov.pbc.tims.entity.";
 	    Class modelclas=Class.forName(packagename+modelName);
 	    List list=new ArrayList();
 	    //String modelName=modelclas.getName();
 	    sqlBuffer.append("from "+modelName+"  as model   where 1=1  ");
 	    //得到类对象
 	    //Class  modelclas = Class.forName(modelName);
 	   //* 得到类中的所有属性集合modelName
	       Field[] fs = modelclas.getDeclaredFields();
	       for(int j = 0 ; j < fs.length; j++){
	           Field f = fs[j]; 
	           f.setAccessible(true); //设置些属性是可以访问的
	           // Object val = f.get(tbl);//得到此属性的值    
	           String name=f.getName();
	           // 添加 判断是否有区间值
			   String beginValue = null;
			   String endValue = null;
			   String type = f.getType().toString();//得到此属性的类型
	           if(parameterMap.containsKey(name))
	           {
	        	   String value=parameterMap.get(name)[0].trim();
	        	   if(type.endsWith("String"))
	        	   {
	        		   if(StringUtils.isNotBlank(value))
	        		   {
	        			   //System.out.println("no empty "+value.length());
	        			   if(ralation.contains("like"))
	        			   { sqlBuffer.append(" and model."+ name+" like  ?  \n");
	        			   	 list.add("%"+StringUtils.trim(value+"%"));}
	        			   else
	        			   { sqlBuffer.append(" and model."+name+ " = ? \n");   
	        			   list.add((String)value);
	        			   }
	        		   }
	        	   }
	        	   else if(type.endsWith("Date"))
	        	     {
						SimpleDateFormat userDefined = null;
						if (StringUtils.isNotBlank(beginValue)) {
							sqlBuffer.append(" and model."+name+ " > ? \n"); 
							if (userDefined != null) {
			        		   list.add(userDefined.parse(beginValue));	
							}
							  else if (beginValue.length() == 19) {
								list.add(time.parse(beginValue));
							} else if (beginValue.length() == 10) {
								list.add(time.parse(beginValue + " 00:00:00"));
							}
						}
						if (StringUtils.isNotBlank(endValue)) {
							sqlBuffer.append(" and model."+name+ " < ? \n"); 
							if (userDefined != null) {
								list.add(userDefined.parse(endValue));	
							} else if (endValue.length() == 19) {
								list.add(time.parse(endValue));
							} else if (endValue.length() == 10) {
								// 对于"yyyy-MM-dd"格式日期，因时间默认为0，故此添加" 23:23:59"并使用time解析，以方便查询日期时间数据
								list.add(time.parse(endValue + " 23:23:59"));
							}
						}
						if (isNotEmpty(value) ){
							sqlBuffer.append(" and model."+name+ " = ? \n");   
		        			   list.add(time.parse(endValue + " 00:00:00"));
						}
	        	  }
	           else if(type.endsWith("Integer"))
	           {
	        	   if (isNotEmpty(value) ){
						sqlBuffer.append(" and model."+name+ " = ? \n");   
	        			   list.add(Integer.valueOf(value));
					}
	           }
	           else if(type.endsWith("BigDecimal"))
	           {
	        	   if (isNotEmpty(value) ){
						sqlBuffer.append(" and model."+name+ " = ? \n");   
	        			   list.add(new BigDecimal(value));
					}
	           }
		       	else  
		       	{
		       		if(null!=value)
		       		{
		       			sqlBuffer.append(" and model."+ name+ "= ?\n");    
		       			list.add(value);
		    		   }
		       	}
	           }
	           
			   if (parameterMap != null&& parameterMap.containsKey(name + BEGIN)) {
					beginValue = parameterMap.get(name + BEGIN)[0].trim();
					if(type.endsWith("Date"))
	        	     {
						SimpleDateFormat userDefined = null;
						if (StringUtils.isNotBlank(beginValue)) {
							sqlBuffer.append(" and model."+name+ " > ? \n"); 
							if (userDefined != null) {
			        		   list.add(userDefined.parse(beginValue));	
							}
							  else if (beginValue.length() == 19) {
								list.add(time.parse(beginValue));
							} else if (beginValue.length() == 10) {
								list.add(time.parse(beginValue + " 00:00:00"));
							}
						}
	        	  }
					
				}
				if (parameterMap != null
						&& parameterMap.containsKey(name + END)) {
					endValue = parameterMap.get(name + END)[0].trim();
					if(type.endsWith("Date"))
	        	     {
						SimpleDateFormat userDefined = null;
						if (StringUtils.isNotBlank(endValue)) {
							sqlBuffer.append(" and model."+name+ " < ? \n"); 
							if (userDefined != null) {
								list.add(userDefined.parse(endValue));	
							} else if (endValue.length() == 19) {
								list.add(time.parse(endValue));
							} else if (endValue.length() == 10) {
								// 对于"yyyy-MM-dd"格式日期，因时间默认为0，故此添加" 23:23:59"并使用time解析，以方便查询日期时间数据
								list.add(time.parse(endValue + " 23:23:59"));
							}
						}
	        	  }
					
				}
	           
	       }
	       List result=new ArrayList();
	       result.add(sqlBuffer.toString());
	       result.add(list);
	       return result;
	     }
	

	       /**
	   	 * 判断是不是空
	   	 */
	   	public static boolean isNotEmpty(Object value) {
	   		return value != null && !"".equals(value);
	   	}
	
}
